package ca.etsmtl.log120.tp1.gui;

/******************************************************
Cours : LOG120
Session : E2011
Groupe : 01
Projet : Laboratoire #2
Etudiants : Nicolas Blais Miko
 	 		Yohan Trepanier-Montpetit
Codes perm. : BLAN24079109
			  TREY16079108
Professeur : Chamseddine Talhi
Charge de labo : Eric Goulet
Nom du fichier : DrawPanel.java
Date cree : 2011-05-15
Date dern. modif. 2015-05-25
 *************************************************** ****
Historique des modifications
 *************************************************** ****
2011-05-15 Version initiale (Yohan Trepanier)
2011-05-24 Suppression de contenu inutile (Yohan Trepanier)
2011-05-25 Ajout du thread de shapeRequester (Yohan Trepanier)
 ***************************************************/

/**
 * Classe recevant des dessins
 */
import java.awt.Color;
import java.awt.Graphics;
import java.io.IOException;
import java.net.UnknownHostException;
import java.util.Observable;
import java.util.Observer;

import javax.swing.JPanel;

import ca.etsmtl.log120.tp1.shapehierarchy.AbstractShape;
import ca.etsmtl.log120.tp1.system.ShapeCreator;
import ca.etsmtl.log120.tp1.system.ShapeRequester;

@SuppressWarnings("serial")
public class DrawPanel extends JPanel implements Observer{

	private static final float RECEP_DELAY = 0.3f;
	ShapeCreator creator = new ShapeCreator();	//Le createur de formes
	ShapeRequester requester;

	/**
	 * Constructeur
	 * @param width Largeur de la zone
	 * @param height Hauteur de la zone
	 */
	public DrawPanel(int width, int height){

		//Parametres du panel
		setSize(width, height);
		setBackground(Color.WHITE);
		repaint();

		//abonnement a la liste, pour savoir quand on la modifie
		creator.shapeList.addObserver(this);

		repaint();
	}

	/**
	 * Affichage des formes
	 */
	public void paint(Graphics graphics){
		super.paint(graphics);

		//on va chercher toutes les formes de la liste
		//et on les affiche
		AbstractShape[] list = (AbstractShape[]) creator.shapeList.toArray();
		for(AbstractShape s: list){
			if(s != null)
				s.drawShape(graphics);
		}

	}

	@Override
	public void update(Observable obj, Object arg) {

		//Update du panel quand la liste de formes change
		//		System.out.println("drawPanel: update");
		repaint();

	}

	/**
	 * Methode qui permet de connecter le client au serveur d'une certaine adresse
	 * @param adresse L'adresse du serveur de forme
	 * @throws IOException 
	 * @throws UnknownHostException 
	 */
	public void connectToServer(String adresse, int port) throws UnknownHostException, IOException{

		//On se connecte au serveur de l'adresse recue en parametre
		creator.connectToServer(adresse, port);

		//demarrage d'une demande continue
		requester = new ShapeRequester(creator, RECEP_DELAY);
		Thread thread = new Thread(requester);
		thread.start();
	}

	/**
	 * Methode permettant de fermer la connection avec le serveur
	 */
	public void end(){

		//On ferme la connection
		creator.closeConnection();

		try{ //On tente de stopper le requester
			requester.stop();

			//Si le requester est null, on attrape l'exception	
		}catch(NullPointerException ex){ex.printStackTrace();}
	}

	/**
	 * Methode permettant de verifier si la connexion est fermee
	 * @return True si aucune connexion n'est ouverte, False sinon
	 */
	public boolean connectionClosed(){

		return creator.connectionClosed();
	}

	/**
	 * Methode permettant de vider l'affichage
	 */
	public void clearAffichage(){

		creator.clearAffichage();
	}

	public void sort(int sortType, boolean upSelected){

		creator.sort(sortType, upSelected);

	}
}
